/**
 * @file Configuration.hpp
 * @brief 配置文件管理类的声明
 * @details 单例模式的配置管理类，用于读取和管理服务器配置信息
 */

#pragma once
#include<map>
#include<string>
#include<pthread.h>
using std::map;
using std::string;

/**
 * @class Configuration
 * @brief 配置文件管理类（单例模式）
 * @details 负责加载和管理服务器配置文件，使用单例模式确保全局唯一
 */
class Configuration{
    public:
    /**
     * @brief 获取Configuration单例实例
     * @return Configuration指针
     */
    static Configuration* getInstance();
    
    /**
     * @brief 加载配置文件
     * @return 成功返回true，失败返回false
     */
    bool loadFromFile();
    
    /**
     * @brief 获取配置项的值
     * @param key 配置项的键名
     * @return 配置项的值，如果不存在返回空字符串
     */
    string get(const string& key) const;
    


    private:
    /**
     * @class AutoRelease
     * @brief 自动释放辅助类
     * @details 在程序退出时自动释放Configuration单例
     */
    class AutoRelease{
        public:
        AutoRelease(){}
        ~AutoRelease(){
            if(_Pconfiguration){
                delete _Pconfiguration;
                _Pconfiguration = nullptr;
            }
        }
    };
    map<string,string> _map;                        ///< 配置项存储容器
    static Configuration* _Pconfiguration;          ///< 单例实例指针
    static AutoRelease _ar;                         ///< 自动释放对象
    static pthread_once_t _once;                    ///< 线程安全初始化控制
    
    /**
     * @brief 私有构造函数
     */
    Configuration(){}
    
    /**
     * @brief 私有析构函数
     */
    ~Configuration(){}
    
    /**
     * @brief 禁用拷贝构造函数
     */
    Configuration(const Configuration& rhs) = delete;
    
    /**
     * @brief 禁用赋值运算符
     */
    Configuration& operator=(const Configuration& rhs) = delete;
    
    /**
     * @brief 单例初始化函数
     */
    static void init();
};
